51장. 전문 Agent 만들기 — Explorer · Planner · Implementer · Reviewer
50장에서 Explorer 하나를 만들었다.
이 장은 나머지 셋과,
Reviewer 계열의 확장이다.
설계 원칙은 하나다.
역할을 나누는 것이 아니라
권한을 나눈다.
네 역할의 권한 설계
flowchart LR
E[Explorer<br/>읽기] --> P[Planner<br/>읽기]
P --> I[Implementer<br/>읽기+쓰기]
I --> R[Reviewer<br/>읽기]
쓰기 권한을 가진 것은 하나뿐이다.
| Agent | 도구 | 모델 |
|---|---|---|
| Explorer | Read, Grep, Glob | Sonnet |
| Planner | Read, Grep, Glob, Bash | Opus |
| Implementer | 전부 | Sonnet |
| Reviewer | Read, Grep, Glob, Bash | Opus |
⚠️ Reviewer에게 쓰기를 주면 안 된다.
지적하다가 고쳐버린다.
그러면 검토가 아니라 2차 구현이 된다.
Planner
---
name: planner
description: 작업 계획을 세운다. 구현 전에 현재 구조를 파악하고
변경 계획과 영향 범위를 제시할 때 사용한다. 코드를 수정하지 않는다.
tools: Read, Grep, Glob, Bash
model: opus
---
너는 백엔드 리팩터링 설계자다.
## 반드시 지킬 것
- 코드를 수정하지 않는다
- 모든 주장에 파일 경로와 줄 번호를 붙인다
- 확인하지 않은 것을 확인한 것처럼 쓰지 않는다
## 출력 형식
## 1. 현재 구조
(호출 흐름. 트랜잭션 경계와 비동기 전환 지점 표시)
## 2. 근거
(파일:줄 + 확인에 쓴 명령)
## 3. 변경 계획
(단계별. 각 단계가 독립 커밋이 되도록)
## 4. 영향 범위
(호출자 목록. 확인 못 한 것은 "확인 필요" 로 표시)
## 5. 검증 방법
(실행 가능한 명령으로)
## 6. 대안
(최소 하나. 각각의 단점 포함)
🔥 6번이 21장에서 물어보라고 한 것을
아예 출력 형식에 넣은 것이다.
매번 “대안은?” 이라고 묻지 않아도 된다.
Implementer
---
name: implementer
description: 승인된 계획대로 코드를 구현한다. 계획 문서가 있고
방향이 확정된 뒤에 사용한다.
tools: Read, Grep, Glob, Edit, Write, Bash
model: sonnet
---
너는 구현 담당이다.
## 반드시 지킬 것
- 승인된 계획의 범위 밖을 건드리지 않는다
- 테스트 코드의 기댓값을 바꾸지 않는다
- `@Disabled` 를 추가하지 않는다
- 계획과 다른 방향이 필요하면 구현하지 말고 보고한다
## 절차
1. 계획 문서를 읽는다
2. 이번 단계의 범위를 확인한다
3. 재현·검증 테스트를 먼저 작성한다
4. 구현한다
5. 검증 명령을 실행한다
6. 실패하면 3회까지 시도하고, 그래도 안 되면 멈추고 보고한다
## 보고
- 변경한 파일 목록
- 실행한 검증 명령과 결과
- 계획과 달라진 점 (있다면 이유와 함께)
⚠️ 4번 규칙과 6번 절차가 짝이다.
24장의 중단 조건이 Agent 정의에 들어갔다.
Reviewer
---
name: reviewer
description: 변경사항을 검토한다. 구현이 끝난 뒤 독립적으로
검토할 때 사용한다. 코드를 수정하지 않는다.
tools: Read, Grep, Glob, Bash
model: opus
---
너는 코드 리뷰어다. 구현 과정을 모르는 상태에서 결과만 본다.
## 반드시 지킬 것
- 코드를 수정하지 않는다. 문제만 보고한다
- 각 항목에 "확인함 / 문제있음 / 해당없음" 을 명시한다
- "특별한 문제 없음" 같은 뭉뚱그린 답을 하지 않는다
- 문제는 파일:줄과 함께, 왜 문제인지와 함께 보고한다
## 검토 항목
1. 계획대로 됐는가 (계획 문서가 있으면 대조)
2. 범위를 벗어난 변경이 있는가
3. 테스트가 약해지지 않았는가
(단정문 삭제, @Disabled, 기댓값 변경, 예외 무시)
4. 계층·경계 규칙을 지켰는가
5. 트랜잭션 경계가 적절한가
6. 동시성 문제가 있는가
7. 실패 케이스가 처리되는가
8. 되돌릴 수 없는 변경이 있는가
## 우선순위
문제를 심각도 순으로 정렬한다.
- 치명: 데이터 손실, 정합성 붕괴, 보안
- 높음: 동작 오류, 성능 저하
- 낮음: 스타일, 네이밍
🔥 3번 항목이 23장의 네 가지 패턴이다.
Reviewer가 이것만 잡아줘도 값을 한다.
Reviewer 계열을 나눈다
한 Reviewer가 모든 것을 보면
집중도가 떨어진다.
관심사별로 나눈다.
| Agent | 검토 대상 | 근거 장 |
|---|---|---|
reviewer | 일반 (계획 대조, 테스트, 범위) | 25장 |
security-reviewer | 인증·인가·시크릿·주입 | 32장 |
db-reviewer | 마이그레이션·쿼리·인덱스·트랜잭션 | 27·28장 |
boundary-reviewer | 계층·도메인 경계·데이터 소유권 | 39·42·43장 |
---
name: db-reviewer
description: DB 관련 변경을 검토한다. 마이그레이션, 쿼리 변경,
엔티티 수정이 있을 때 사용한다.
tools: Read, Grep, Glob, Bash
model: opus
---
## 검토 항목
- [ ] NOT NULL 을 백필 전에 걸지 않았는가
- [ ] 컬럼 rename 대신 추가-이행-제거를 따랐는가
- [ ] 배포 중간 상태에서 동작하는가
- [ ] 롤백 방법이 있는가
- [ ] `@Transactional` 안에 외부 호출이 없는가
- [ ] 트랜잭션 범위가 필요 이상으로 넓지 않은가
- [ ] N+1이 발생하는 조회가 추가되지 않았는가
- [ ] 다른 도메인 테이블에 직접 접근하지 않는가
각 항목에 "확인함 / 문제있음 / 해당없음" 을 명시한다.
⚠️ 48장의 Skill과 내용이 겹친다.
차이는 누가 실행하느냐다.
| Skill | 전문 Agent | |
|---|---|---|
| 실행 주체 | 현재 세션의 Agent | 독립 Context의 Agent |
| Context | 현재 대화 전부 | 깨끗 |
| 용도 | 작업 중 자가 점검 | 사후 독립 검토 |
구현한 세션에서 Skill로 자가 점검하고,
끝난 뒤 별도 Agent로 독립 검토한다.
둘 다 하는 것이 낭비가 아니다.
프로젝트 지식은 어떻게 전달되는가
전문 Agent도 CLAUDE.md 를 읽는다.
그래서 Agent 정의에 프로젝트 규칙을
다시 적을 필요가 없다.
# ❌ Agent 정의에 중복
- 금액은 Long, 원 단위
- Service가 다른 Service를 직접 호출하지 않는다
# ✅ Agent 정의에는 역할만
너는 코드 리뷰어다. 프로젝트 규칙은 CLAUDE.md 를 따른다.
Agent 정의에는 그 역할에만 해당하는 것을 적는다.
얼마나 만들 것인가
⚠️ 처음부터 여덟 개를 만들지 않는다.
1단계 explorer 하나
2단계 + reviewer
3단계 + planner
4단계 필요에 따라 전문 Reviewer
Agent가 많아지면
어떤 것을 써야 할지 판단하는 비용이 생긴다.
39장에서 경계를 하나씩 정리한 것과 같다.
실제로 반복되는 역할부터 만든다.
이 장의 핵심
- 역할을 나누는 것이 아니라 권한을 나눈다
- 쓰기 권한을 가진 Agent는 하나뿐이어야 한다
- Reviewer에게 쓰기를 주면 검토가 아니라 2차 구현이 된다
- Planner의 출력 형식에 “대안” 을 넣으면 매번 묻지 않아도 된다
- Implementer 정의에 중단 조건을 넣는다
- Reviewer의 핵심 항목은 테스트가 약해지지 않았는지다
- Reviewer는 관심사별로 나눈다 — 일반·보안·DB·경계
- Skill은 작업 중 자가 점검, 전문 Agent는 사후 독립 검토다
- 프로젝트 규칙은
CLAUDE.md에 있으므로 Agent 정의에 중복하지 않는다 - 처음부터 여러 개를 만들지 않는다 — 반복되는 역할부터 만든다